package com.daiziru.wuyanmall.controller;

import com.daiziru.wuyanmall.service.OrderService;
import com.daiziru.wuyanmall.websocket.WebSocketServer;
import com.github.wxpay.sdk.WXPayUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;

/**
 * 作者：無言
 * 时间：2022/3/19 17:48
 * 描述：永无BUG
 */


@CrossOrigin
@RequestMapping("/pay")
@RestController
public class PayController {

    /**
     * 支付回调接口，就是扫码完成后，微信服务器向接口发送请求，将支付状态的信息传递过来
     * 然后修改订单的状态，前端的页面显示等
     * 我们的项目是在本地运行的吗，微信支付平台的公网要像我们发送请求是发送不到的，
     * 所以要实现内网穿透，那么什么是内网穿透呢？（netapp \  ngrok)
     * 也就是我们本地的和一个内网穿透的服务器建立长链接，然后这个代理服务器
     * 公网将我们的长连接映射成为地址，然后微信支付平台就可以通过这个连接给我们本地发送请求了
     */
    @Autowired
    private OrderService orderService;


    @RequestMapping("/callback")
    public String paySuccess(HttpServletRequest request) throws Exception{
        System.out.println("-------------callback");
        //1、接收微信支付平台传递的数据（使用request的输入流接收）
        ServletInputStream is = request.getInputStream();
        byte[] bs = new byte[1024];
        int len = -1;
        StringBuilder builder = new StringBuilder();//线程不安全
        while((len = is.read(bs)) != -1) {
            builder.append(new String(bs, 0, len));
        }
        String s = builder.toString();
        System.out.println(s);//打印出来的字符串比较难懂
        //上面得到的字符串比较复杂，所以使用帮助类将xml接口的字符串转化为map
        Map<String, String> map = WXPayUtil.xmlToMap(s);
        System.out.println("---------------转化成为map之后-----");
        System.out.println(map);

        //判断是否支付成功
        //result_code是上面字符串的响应状态，可以看打印的字符串{
        if(map != null && "success".equalsIgnoreCase(map.get("result_code"))){
            //支付成功
            //2、修改订单的状态为代发货或者已支付
            String orderId = map.get("out_trade_no");
            System.out.println("---orderId:" + orderId);
            int i = orderService.updateOrderStatus(orderId, "2");
            //3、通过webSocket连接，向前端推送消息，说支付成功，实现页面跳转
            WebSocketServer.sendMsg(orderId, "1");
            //4、修改订单成功，响应微信支付平台，否则微信支付平台会一直给你发送请求
            if(i > 0) {
                HashMap<String, String> resp = new HashMap<>();
                resp.put("return_code","success");
                resp.put("return_msg", "OK");
                resp.put("appid", map.get("appid"));
                resp.put("result_code", "success");
                return WXPayUtil.mapToXml(resp);
            }
        }
        return null;
    }
}
